\subsection{Primera consigna: implementación de un cliente ARP}

El cliente ARP definido recibe como parámetros la IP a la cual se quiere enviar el paquete ARP y la interfaz local por la cual se quiere enviar dicho paquete.
Una vez que el usuario ingresa esos valores, se crea un paquete ARP conteniendo la IP ingresada y se configura la propiedad hwdst como para efectuar broadcast.
El comando sr() envía el paquete y queda a la escucha de respuesta, en caso de que alguna computadora haya respondido, se muestra por consola el mapeo IP, MAC address.


\lstset{language=python,title={Cliente ARP},caption={Cliente ARP}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  
def resolveHardwareAddress(self, ipAddress, interface):

		arpPacket = ARP()
		arpPacket.pdst= ipAddress
		arpPacket.hwdst = "ff:ff:ff:ff:ff:ff"
					 
		res = sr(arpPacket, iface = interface)
		
		answeredPackets = res[0]
		
		return answeredPackets.summary() 
		
  \end{lstlisting}
\end{footnotesize}

La ejecución de la función send and receive (sr), devuelve una dupla de (paquete,respuesta), paquetes no respondidos, en este caso estamos interesados en información a cerca de las respuestas recibidas, es por ello que enviamos a pantalla la primera parte de la dupla.

\paragraph{Análisis}

Al enviar el paquete y dependiendo del contexto de red, pueden pasar alguno de los siguientes casos:
\begin{itemize}
\item Una vez enviado el request el cliente queda a la espera de una respuesta, en el caso que la dirección de red solicitada sea inexistente el cliente quedara esperando en forma indefinida. Puede ser útil en algunos casos ingresar un time-out para controlar esta situación. 
\item En las sucesivos pedidos del cliente A por el mismo IP del cliente B, este omite el broadcast, ya que tiene información necesaria para llegar a la interfaz de B. En caso de que el IP de B cambie, es tarea de este host avisar de tal situación al host A. Luego la tabla de mapeo del host A se actualiza con el valor del host B
\item Otro caso en donde el host queda esperando indefinidamente la respuesta, es cuando se envía un paquete ARP con IP destino igual al IP origen. Tiene sentido que si el host queda escuchando por la respuesta al broadcast, no este disponible para enviar ningún paquete.
\end{itemize}

\subsection{Segunda consigna: capturando tráfico}

Scapy cuenta con una función (\texttt{sniff}) que permite escuchar el trafico de paquetes que pasa por una determinada interfaz de red. Configurando los parámetros de forma tal que filtre por tipo de paquetes ARP, y dado un tiempo definido por el usuario, esta función puede mostrar la información de cada paquete de ese tipo que pasa por dicha interfaz.


\lstset{language=python,title={ARP: Sniffing},caption={ARP: Sniffing}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  
	def sniff(self,limitTime,interface):
	
		res = sniff(filter = "arp", 
					timeout = limitTime , 
					iface = interface ,
					prn = customPacketDisplay)

  \end{lstlisting}
\end{footnotesize}

\paragraph{Análisis}

Se considera entropía a la cantidad media de información que contienen los símbolos de una fuente. En este caso, se modela de forma tal que la fuente está representada por el flujo de mensajes ARP enviados por la red, y los símbolos por las direcciones IP contenidas en dichos mensajes. La entropía de la red fue calculada a partir de los registros subidos de paquetes ARP por la cátedra, utilizando el código de \texttt{EntropyCalculator.py}. Sobre un total aproximado de 31.000 registros, se realizaron distintas ejecuciones, cada una sobre un total distinto de registros. Los resultados de la entropía fueron los siguientes:

\begin{itemize}
\item   500 registros, Entropía = 9.3531
\item  1000 registros, Entropía = 9.5024
\item  5000 registros, Entropía = 8.7549
\item 15000 registros, Entropía = 9.1206
\item 30000 registros, Entropía = 9.3257
\end{itemize}

Estos números muestran que el nivel de incertidumbre de la LAN relevada mantiene su valor, mas allá de la cantidad de símbolos que entren en el analisis.

\subsection{Tercera consigna: gráficos y análisis}

\input{analisis.tex}
